<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <p data-lake-id="ue704ece1" id="ue704ece1"><span data-lake-id="u1886e63b" id="u1886e63b">并不一定哦！</span></p>
  <p data-lake-id="u625ecd15" id="u625ecd15"><span data-lake-id="ueb8460b8" id="ueb8460b8">​</span><br></p>
  <p data-lake-id="u73b13c03" id="u73b13c03"><span data-lake-id="u99ad5794" id="u99ad5794">为了保证对象的内存分配过程中的线程安全性，HotSpot虚拟机提供了一种叫做TLAB(Thread Local Allocation Buffer)的技术。</span></p>
  <p data-lake-id="u351de51d" id="u351de51d"><span data-lake-id="u4c4f02f2" id="u4c4f02f2">​</span><br></p>
  <p data-lake-id="u787de3df" id="u787de3df"><span data-lake-id="u10d33313" id="u10d33313">在线程初始化时，虚拟机会为每个线程分配一块TLAB空间，只给当前线程使用，当需要分配内存时，就在自己的空间上分配，这样就不存在竞争的情况，可以大大提升分配效率。</span></p>
  <p data-lake-id="u7290b5c8" id="u7290b5c8"><span data-lake-id="u4c30bbfc" id="u4c30bbfc">​</span><br></p>
  <p data-lake-id="u79b5c0cd" id="u79b5c0cd"><span data-lake-id="u73c1c13c" id="u73c1c13c">所以，“堆是线程共享的内存区域”这句话并不完全正确，因为TLAB是堆内存的一部分，他在读取上确实是线程共享的，但是在内存分分配上，是线程独享的。</span></p>
  <p data-lake-id="u9f302a54" id="u9f302a54"><span data-lake-id="ua2f86ecf" id="ua2f86ecf">​</span><br></p>
  <p data-lake-id="u8e7e470e" id="u8e7e470e"><span data-lake-id="u979900ca" id="u979900ca">TLAB的空间其实并不大，所以大对象还是可能需要在堆内存中直接分配。那么，对象的内存分配步骤就是先尝试TLAB分配，空间不足之后，再判断是否应该直接进入老年代，然后再确定是再eden分配还是在老年代分配。</span></p>
  <p data-lake-id="u2a3f9538" id="u2a3f9538"><br></p>
 </body>
</html>